package com.xlf.service.base.service.impl.validate;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.xlf.common.auth.util.SecurityUtils;
import com.xlf.common.core.constant.Constants;
import com.xlf.common.core.exception.BizException;
import com.xlf.common.core.util.StringUtils;
import com.xlf.pojo.base.Contest;
import com.xlf.pojo.base.ContestRegister;
import com.xlf.service.base.mapper.ContestMapper;
import com.xlf.service.base.mapper.ContestRegisterMapper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.validation.constraints.NotNull;
import java.util.Date;

/**
 * @Author xlf 2734029211@qq.com
 * @Date 2023/12/22 22:41
 * @Description: TODO 比赛的校验
 * @Version 1.0
 */
@Service
public class ContestValidator {


    @Resource
    ContestRegisterMapper contestRegisterMapper;

    @Resource
    ContestMapper contestMapper;

    /**
     * 用户是否注册成功
     */
    @NotNull
    public boolean contestRegisterValidator(Long cid){

        Object userId = SecurityUtils.getUserId();

        return contestRegisterMapper.exists(new LambdaQueryWrapper<ContestRegister>()
                .eq(ContestRegister::getUid,userId)
                .eq(ContestRegister::getCid,cid)
                .eq(ContestRegister::getStatus, Constants.NORMAL));
    }


    /**
     * 是否是比赛的创建人
     * @param cid
     */
    @NotNull
    public boolean contestCreateByValidator(Long cid){

        Object userId = SecurityUtils.getUserId();
        //超级管理员
        if(SecurityUtils.isAdmin((Long) userId))
            return true;

        return contestMapper.exists(new LambdaQueryWrapper<Contest>()
                .eq(Contest::getUid,userId)
                .eq(Contest::getId,cid));
    }


    /**
     * 比赛查询校验
     * @param cid
     */
    @NotNull
    public Contest queryValidator(Long cid){

        //训练查询无限制
        if(cid.equals(0L))
            return null;

        Contest contest = getContest(cid);

        //比赛未开始不能进行查询操作
        Date date = new Date();
        if(date.before(contest.getStartTime()))
            throw new BizException("比赛未开始！");


        if((com.xlf.pojo.constant.Constants.Contest.AUTH_PRIVATE.getCode()).equals(contest.getAuth())){ //私有赛
            //只有在比赛中注册的用户（或创建人）可以查看查看比赛详情、比赛题目、比赛提交，比赛排行榜、比赛讨论等
            if((!contestCreateByValidator(cid)) && (!contestRegisterValidator(cid)))
                throw new BizException("私有赛，没有权限查询！");

        }
        //公有赛都可以查询

        return contest;

    }

    /**
     * 比赛提交校验
     * @param cid
     */
    @NotNull
    public Contest submitValidator(Long cid){

        //训练提交无限制
        if(cid.equals(0L))
            return null;

        Contest contest = getContest(cid);


        Date date = new Date();
        if(date.before(contest.getStartTime()))
            throw new BizException("比赛未开始！");

        if(date.after(contest.getEndTime()))
            throw new BizException("比赛已结束！");

        //只有在比赛中注册的用户才能提交
        if(!contestRegisterValidator(cid))
            throw new BizException("未报名，没有权限提交！");

//        if(contest.getAuth() == com.xlf.pojo.constant.Constants.Contest.AUTH_PRIVATE.getCode()){ //私有赛
//
//            //只有在比赛中注册的用户才能提交
//            if(!contestRegisterValidator(cid))
//                throw new BizException("私有赛，没有权限提交！");
//
//        }

        return contest;

    }

    /**
     * 获取比赛
     * @param cid
     * @return
     */
    @NotNull
    private Contest getContest(Long cid) {

        Contest contest = contestMapper.selectById(cid);

        if (StringUtils.isNull(contest))
            throw new BizException("比赛不存在！");

        if ((Constants.EXCEPTION).equals(contest.getStatus()))
            throw new BizException("比赛已被禁用！");
        return contest;

    }
}
